/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 *
 * @author user
 */
public class LectorArchivo {
    public LectorArchivo(){
    
    }
    
    public TablaPosiciones abrirTablaPosiciones(String nombreLiga) {
        ObjectInputStream input = null;
        try {
            input = new ObjectInputStream(new FileInputStream("Ligas/"+nombreLiga+"/TablaPosiciones.obj"));
            TablaPosiciones tablaPos = (TablaPosiciones) input.readObject();
            input.close();
            return tablaPos;
        } catch (Exception ex) {
            return null;
        }
    }
    
    public void guardarTablaPosiciones(TablaPosiciones tablaPos, String nombreLiga) {
        try {
            ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("Ligas/"+nombreLiga+"/TablaPosiciones.obj"));
            output.writeObject(tablaPos);
            output.close();
        } catch (IOException ex) {
            System.out.println("no se guardo la tablis jeje");
            return;
        }   
    }
    
    public Liga[] leerLigas(){
        try{
            Liga[] ligas;
            int nLigas;
            String cadena;
            
            File f = new File("Ligas/CONFIGURACION.txt");
            FileReader fr = new FileReader(f.getAbsolutePath());
            BufferedReader br = new BufferedReader(fr);
            
            nLigas = Integer.parseInt(br.readLine());
            ligas = new Liga[nLigas];
            cadena = br.readLine();
            for (int i = 0 ; i < nLigas && cadena!=null ; i++){
                //instancio el objeto liga y leo los atributos de archivo
                ligas[i] = new Liga(cadena);
                ligas[i].setTablaPosiciones(abrirTablaPosiciones(ligas[i].getNombre()));  
                if (ligas[i].getTablaPosiciones() == null){
                    TablaPosiciones TB = new TablaPosiciones(ligas[i].getNombre());
                    ligas[i].setTablaPosiciones(TB);
                }
                cadena = br.readLine();           
            }
            //cierro los archivos
            fr.close();
            br.close();
            
            return ligas;
        }
        catch (Exception e){
            JOptionPane.showMessageDialog(null,"Error leerLigas: \nArchivo("+"CONFIGURACION"+".txt)"+e.getMessage());
        }
        return null;
    }
    
    public String[] leerCalendarioEncuentros(String liga){
        try{
            String encuentros[];
            int nEncuentros;
            String cadena;
            
            
            File f = new File("Ligas/"+liga+"/CALENDARIO.txt");
            FileReader fr = new FileReader(f.getAbsolutePath());
            BufferedReader br = new BufferedReader(fr);
            
            nEncuentros = Integer.parseInt(quitarEspIneces(br.readLine()));
            encuentros = new String[nEncuentros];
            
            cadena = br.readLine();
            for (int i=0,k=0; i < nEncuentros && cadena!=null; i++,k=0){
                
                if ((verificaPunto(cadena,"CALENDARIO.txt")==true))
                    return null;
                /*String local,visitante,fecha,id;               
                id = cadena.substring(k, k = cadena.indexOf(",",k))
                local = cadena.substring(++k, k = cadena.indexOf(",",k));
                visitante = cadena.substring(++k,k = cadena.indexOf(",",k));
                fecha = cadena.substring(++k,cadena.length()) ;*/          
                encuentros[i] = quitarEspIneces(cadena);
                cadena = br.readLine();
            }
            verificarIds(encuentros);
            //cierro los archivos
            fr.close();
            br.close();
        
            return encuentros;
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null,"Error leerCalendarioEncuentro: \nArchivo(CALENDARIO.txt) "+e.getMessage());
        }
        return null;
    }
    
    public Jugador[] leerJugadores(String liga,String equipo, int indiceEquipo) {
        try{
            Jugador[] jugadores;
            int nJugadores;
            String cadena;
        
            File f = new File("Ligas/"+liga+"/"+equipo+".txt");
            FileReader fr = new FileReader(f.getAbsolutePath());
            BufferedReader br = new BufferedReader (fr);
        
            nJugadores = Integer.parseInt(br.readLine());
            jugadores = new Jugador[nJugadores];
          
            cadena = br.readLine();
                
            for (int i=0,k=0; i < nJugadores && cadena!=null; i++,k=0){                
                String nombre,apellido,posicionPreferida,nroDorsal,di,me,an;
                Date edad;
                int dia,mes,anio;
                if ((verificaPunto(cadena,equipo)==true))
                    return null;
                //leo cada atributo que se encuentra separado por comas en el archivo
                nombre = quitarEspIneces(cadena.substring( k , k = cadena.indexOf(",",k)));
                apellido =quitarEspIneces(cadena.substring( ++k , k = cadena.indexOf(",",k)));
            
                di= quitarEspIneces(cadena.substring (++k , k = cadena.indexOf("/",k)));
                dia = Integer.parseInt(di);               
                me = quitarEspIneces(cadena.substring (++k , k = cadena.indexOf("/",k)));
                mes = Integer.parseInt(me);                
                an = quitarEspIneces(cadena.substring (++k , k = cadena.indexOf(",",k)));
                anio = Integer.parseInt(an);
                if((verificaNumero(di,equipo)==true) || (verificaNumero(me,equipo)==true) || (verificaNumero(an,equipo)==true))
                    return null;
                
                edad = new Date(anio-1900,mes-1,dia);
                posicionPreferida = quitarEspIneces(cadena.substring( ++k , k = cadena.indexOf(",",k)));
                nroDorsal = quitarEspIneces(cadena.substring( ++k ,cadena.length()));
                
                if ((verificaEdadMaxima(anio,equipo)==true) || (verificaEdadMinima(anio,equipo)==true))
                    return null;
                jugadores[i] = new Jugador(nombre,apellido,edad,posicionPreferida,nroDorsal,indiceEquipo);
                //leo la siguiente linea
                cadena = br.readLine();
            }
            verificarNroDorsal(jugadores,equipo);
            //cierro los archivos
            fr.close();
            br.close();
        
            return jugadores;
        }
        catch (Exception e){
            JOptionPane.showMessageDialog(null,"Error leerJugadores:\nArchivo("+equipo+".txt)" +e.getMessage());
        }
        return null;
    }

    
    public void verificarIds (String calendarioEncuentros[]){
        int i,j,f=0;
        
        for ( i=0 ; i<calendarioEncuentros.length ; i++ ){
            for ( j=0 ; j<calendarioEncuentros.length ; j++ ){
                String id1,id2;
                id1 = calendarioEncuentros[i].substring(0,calendarioEncuentros[i].indexOf(",",0));
                id2 = calendarioEncuentros[j].substring(0, calendarioEncuentros[j].indexOf(",",0));
                if (i == j)
                    continue;
                else if (id1.contentEquals(id2) && f!=i){
                    f=j;
                    JOptionPane.showMessageDialog(null,"Error al leer Archivo(CALENDARIO.txt)\n El id: " + id1 +" se repite");
                    break;
                }
            }
        }
    }
    
    public String quitarEspIneces(String str){
        return str.replaceAll(" +", " ").trim();
    }
    
    public boolean verificaEdadMaxima(int anio, String equipo){
        Date fecha = new Date();
        int anioActual;
        
        anioActual = fecha.getYear()+1900;
        if ((anioActual-anio)>43){
            JOptionPane.showMessageDialog(null,"Error en Archivo("+equipo+".txt): \nEdad Muy Alta");
            return true;
        }
        return false;
    }
    
        public boolean verificaEdadMinima(int anio, String equipo){
        Date fecha = new Date();
        int anioActual;
        
        anioActual = fecha.getYear()+1900;
        if ((anioActual-anio)<16){
            JOptionPane.showMessageDialog(null,"Error en Archivo("+equipo+".txt): \nEdad Muy Baja");
            return true;
        }
        return false;
    }
    
    public boolean verificaPunto(String cadena,String equipo){
        if(cadena.contains(".")==true){
            JOptionPane.showMessageDialog(null, "Error en Archivo: ("+equipo+".txt) Punto no valido");
            return true;
        }
        return false;
    }
    
    public boolean verificaEspacios(String cadena,String equipo){
        if(cadena.contains(" ")==true){
            JOptionPane.showMessageDialog(null, "Error en Archivo: ("+equipo+".txt) Espacios en blanco");
            return true;
        }
        return false;
    }
    
    public boolean verificaNumero(String n, String equipo){
        int numero;
        
        try{
            numero = Integer.parseInt(n);
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, "Error en Archivo: ("+equipo+".txt)\nUn Tipo de Valor no es numero");
            return true; 
        }
        return false;
    }
    
    public void verificarNroDorsal (Jugador jugadores[],String equipo){
        int i,j,nD,f=0;
 
        for ( i=0 ; i<jugadores.length ; i++ ){
            for ( j=0 ; j<jugadores.length ; j++ ){
                String id1,id2;
                id1 = jugadores[i].nroDorsal;
                id2 = jugadores[j].nroDorsal;

                if(verificaNumero(id1,equipo)==true)
                    return;
                
                if (i == j)
                    continue;
                else if (id1.contentEquals(id2) && f!=i){
                    f=j;
                    JOptionPane.showMessageDialog(null, "Error en Archivo: ("+equipo+".txt) Dorsal Repetido");
                    return;
                }
            }
        }
    }
    
    public void guardarEncuentro (String liga, String id , Encuentro encuentro){
        try{
            File f = new File ("Ligas/"+liga+"/Grafos/Encuentro"+id+".obj");
            FileOutputStream fout = new FileOutputStream (f.getAbsolutePath());
            DataOutputStream out = new DataOutputStream (fout);
            ObjectOutputStream objectOut = new ObjectOutputStream (out);
            objectOut.writeObject(encuentro);
            
            objectOut.close();       
            out.close();
            fout.close();
            
        }
        catch (Exception e){
            System.out.println("error guardarEncuentro: " + e.getMessage());
        }
    }
    
    public Encuentro leerEncuentro (String liga , String id){
        try{
            File f = new File ("Ligas/"+liga+"/Grafos/Encuentro"+id+".obj");
            FileInputStream fin = new FileInputStream (f.getAbsolutePath());
            DataInputStream in = new DataInputStream (fin);
            ObjectInputStream objectIn = new ObjectInputStream (in);
            Encuentro encuentro = (Encuentro)objectIn.readObject();
            
            fin.close();
            in.close();
            objectIn.close();
            
            return encuentro;
        }
        catch (Exception e){
            //System.out.println("Error leerEncuentro: explota todo");
            return null;
        }
    }
    
    public void borrarGrafos (String liga){
        try{
            String archivos[];
            String cadena;
           
            File f = new File ("Ligas/"+liga+"/Grafos/");
            archivos = f.list();
            FileReader fr = new FileReader(f.getAbsolutePath());
            BufferedReader br = new BufferedReader (fr);
          
            //cadena = br.readLine();
            for (int i = 0 ; i < archivos.length ; i++){
                File fgrafo = new File ("Ligas/"+liga+"/Grafos/"+archivos[i]);
                fgrafo.delete();
                //cadena = br.readLine();
            }
            fr.close();
            br.close();
        }
        catch (Exception e){
            System.out.println("error borrarGrafos: " + e.getMessage());
        }
    }
    //Metodo que se utilizara en TablaPosiciones
   public String[] leerEquipos (String liga){
        try{
            String equipos[];
            int nEquipos;
            String cadena;
                
            File f = new File ("Ligas/"+liga+"/CONFIGURACION.txt");
            FileReader fr = new FileReader(f.getAbsolutePath());
            BufferedReader br = new BufferedReader(fr);
            
            nEquipos = Integer.parseInt(quitarEspIneces(br.readLine()));
            equipos = new String[nEquipos];
            
            cadena = br.readLine();
            for (int i=0 ; i < nEquipos && cadena!=null ; i++){
                equipos[i] = quitarEspIneces(cadena);
                cadena = br.readLine();
            }
            //cierro los archivos
            fr.close();
            br.close();
            
            return equipos;
            
        }
        catch (Exception e){
            System.out.println("Error leerEquipos: "+e.getMessage());
        }
        return null;
    }
}
